/*
 * libCache.h
 *
 *  Created on: 21/06/2012
 *      Author: utnso
 */

#ifndef LIBCACHE_H_
#define LIBCACHE_H_

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include "libMat.h"
#include <string.h>
#include <pthread.h>
#include <memcached/engine.h>
#include "libArchivoLog.h"
#include "tiempo.h"

#define ALGORITMO_WORST_FIT 0
#define ALGORITMO_NEXT_FIT 1
#define ALGORITMO_FIFO 0
#define ALGORITMO_LRU 1
#define DIVIDIR_PARTICION_MINIMA -1
#define ADMINISTRACION_COMPACTACION 0
#define ADMINISTRACION_BUDDY 1

typedef struct memCache_t {
	size_t nkey;
	char key[42];
	size_t ndata;
	char estado;
	struct timeval tiempo;
	uint32_t codBuddy;
	uint8_t enUso;
	//TODO MODIFICADO pthread_rwlock_t semChunk;
	pthread_mutex_t mutexChunk;
//TODO HAY QUE GUARDAR EL TAMANIO TAMBIEN? (PARA NO DEVOLVER BASURA)
} memCache_t;

typedef struct CUCA_diccionario_t {
	memCache_t* vectorCache;
	char* cache;
} CUCA_diccionario_t;

memCache_t* inicializarCache(uint32_t);

uint32_t cantidadConMismoEstadoYCodBuddy(memCache_t*, uint32_t*, char, uint32_t);

uint8_t compararKeys(char*, size_t, char*, size_t);

uint32_t cantidadConMismoEstadoYKey(memCache_t*, uint32_t*, char, char*, size_t);

uint32_t cantidadConMismoCodigoBuddy(memCache_t*, uint32_t);

uint32_t cantidadConMismoEstado(memCache_t*, uint32_t*, char, uint8_t);

int32_t worstFit(memCache_t *, uint32_t);

/*char* leerCache(char*,uint32_t,uint32_t);*/

void escribirCache(char*, uint32_t, uint32_t, const char*);

int64_t buscarPrimerLibre(memCache_t*);

void swapearCache(char*, uint32_t, uint32_t);

void compactarCache(char*, memCache_t*);

int32_t NextFit(memCache_t*, uint32_t);

void cargarCache(uint32_t, uint32_t, size_t, const char*, CUCA_diccionario_t, const char*, size_t);

void cargarKey(uint32_t, uint32_t, size_t, const char*, CUCA_diccionario_t, size_t);

int64_t buddySystem(memCache_t*, uint32_t);

int32_t crearBuddies(memCache_t*, uint32_t, uint32_t);

void eliminarParticion(memCache_t*);

void eliminarParticionNextFit(memCache_t*);

ENGINE_ERROR_CODE buscaYBorraWorstFit(memCache_t*, char*, size_t);

ENGINE_ERROR_CODE buscaYBorraNextFit(memCache_t*, char*, size_t);

void intentarUnirBuddies(memCache_t*, uint32_t);

uint32_t unirBuddies(memCache_t*, uint32_t, uint32_t);

uint8_t yaExisteKey(char*, size_t, CUCA_diccionario_t);

#endif /* LIBCACHE_H_ */
